package main

import (
	"encoding/json"
	"fmt"
	"goeasymodbus/goeasymodbus"
)

// main 函数是程序的入口点
func main() {
	jsString := `{"funcCode":1,"modbusType":"tcp","register":0,"registerLength":1,"slaveID":0,"wrData":[3]}`
	// 初始化一个 ProtocolJsonStruct 结构体，用于接收解析后的 JSON 数据
	jsSend := &goeasymodbus.ProtocolJsonStruct{}
	// 使用 json.Unmarshal 将 JSON 字符串解析到 ProtocolJsonStruct 结构体中
	err := json.Unmarshal([]byte(jsString), jsSend)
	// 如果解析过程中发生错误，打印错误信息并终止程序
	if err != nil {
		fmt.Println("json Unmarshal err:", err)
		return
	}
	// 根据 ProtocolJsonStruct 结构体创建 ProtocolParser 实例，用于后续操作
	newprotocol := goeasymodbus.NewProtocolParser(*jsSend)

	// 使用 ProtocolParser 的 EncodeJsonToModbusFrame 方法将 JSON 编码为 Modbus 帧
	data, err := newprotocol.EncodeJsonToModbusFrame()
	// 如果编码过程中发生错误，打印错误信息并终止程序
	if err != nil {
		fmt.Println("EncodeJsonToModbusFrame err:", err)
		return
	}
	// 打印编码后的 Modbus 帧数据和可能的错误信息
	fmt.Printf("data %s,%v \n", data, err)

	// 模拟收到一个 Modbus 响应的 ASCII 字符串
	// 响应的ascii测试
	// ack := ":000600000001F9\r\n"
	// 响应的rtu测试
	// ack := []byte{0x00, 0x01, 0x01, 0x02, 0xd1, 0xb5}
	// 响应的tcp测试
	ack := []byte{0, 0, 0, 0, 0, 4, 0x00, 0x01, 0x01, 0x02}

	// 使用 ProtocolParser 的 DecodeModbusFrameToJson 方法将 Modbus 帧字符串解码为 ProtocolJsonStruct 结构体
	jsSend2, err := newprotocol.DecodeModbusFrameToJson([]byte(ack))
	// 如果解码过程中发生错误，打印错误信息并终止程序
	if err != nil {
		fmt.Println("DecodeModbusFrameToJson err:", err)
		return
	}
	// 打印解码后的 ProtocolJsonStruct 结构体和错误信息
	fmt.Printf("js2 %v,%v \n", jsSend2, err)
	// 将解码后的结构体转换为 JSON 字符串，用于后续分析或传输
	jsString2, err := json.Marshal(jsSend2)
	// 如果转换过程中发生错误，打印错误信息
	if err != nil {
		fmt.Println("json Marshal err:", err)
		return
	}
	// 打印 JSON 字符串和 ProtocolParser 中的 Verify 字段，用于验证或调试
	fmt.Printf("verify %s,%v \n", jsString2, newprotocol.Verify)
}
